package van.planifolia.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.PasswordEncoder;
import van.planifolia.service.UserService;

import javax.annotation.Resource;

/**
 * @Description: TODO 配置Security的一些信息
 * @Author: Van.Planifolia
 * @CreateTime: 2023-01-03  10:36
 * @Version: 1.0
 */
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Resource(name = "userService")
    private UserService userService;
    @Resource
    private PasswordEncoder passwordEncoder;

    /**
     * 配置身份验证信息的方法
     * @param auth 身份验证规则构建器
     * @throws Exception 异常
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 设置基于自己的身份验证,并且制定密码编码器
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
    }

    /**
     * 配置Spring Security的方法
     *
     * @param http 被配置的对象
     * @throws Exception 异常
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 配置登录页面的信息
        http.formLogin()
                // 设置自定义表单地提交路径
                .loginProcessingUrl("/login")
                // 自定义的登录页面
                .loginPage("/login.html")
                // 登录失败的信息
                .failureUrl("/errorMsg")
                // 登录成功之后的跳转页面
                .successForwardUrl("/main")
                // 上面的这些内容允许全部的用户访问
                .permitAll()

        ;
        // 拦截其他的所有请求
        http.authorizeRequests().anyRequest().authenticated();
        // 以及权限不足地跳转页面
        http.exceptionHandling().accessDeniedPage("/403.html");
        // 为了我们能够正常使用自定义的登录页面我们要禁用csrf
        http.csrf().disable();
    }
}
